package bolao.view;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;

import org.swingBean.actions.ApplicationAction;
import org.swingBean.descriptor.BeanTableModel;
import org.swingBean.descriptor.TableFieldDescriptor;
import org.swingBean.descriptor.XMLDescriptorFactory;
import org.swingBean.gui.JBeanTable;

import bolao.entities.Aposta;
import bolao.persistence.ApostaDAOPostgre;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class ResultadosBolao implements Janela{

	private JFrame janela;
	private JBeanTable apostadoresTable;
	private BeanTableModel<Aposta> apostadoresModel;

	public void abrir(){
		janela = new JFrame("Lista de Apostadores");
		janela.setLayout(new BorderLayout());
		janela.setSize(600, 500);
		janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		TableFieldDescriptor descriptor = XMLDescriptorFactory.
		getTableFieldDescriptor(Aposta.class, 
				"bolao/view/apostadorTable.xml", "ApostadoresTable");
		apostadoresModel = new BeanTableModel<Aposta>(descriptor);
		apostadoresTable = new JBeanTable(apostadoresModel);		
		apostadoresTable.addDoubleClickAction(new ApplicationAction(){

			@Override
			public void execute() {
				int linhaSelecionada = apostadoresTable.getSelectedRow();
				Aposta apostaSelecionada = apostadoresModel.getBeanAt(linhaSelecionada);
				ApostaForm form = new ApostaForm(apostaSelecionada);
				janela.dispose();
				try {
					form.abrir();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}				
			}

		});
		janela.getContentPane().add(new JScrollPane(apostadoresTable), BorderLayout.NORTH);

		JPanel botoes = criarBotoes();
		janela.getContentPane().add(botoes, BorderLayout.SOUTH);

		janela.setVisible(true);
	}

	private JPanel criarBotoes() {
		JPanel botoes = new JPanel();
		botoes.setLayout(new GridLayout(2,3));

		JButton recuperarTodos = new JButton("Recuperar Todos");
		recuperarTodos.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				ApostaDAOPostgre dao = new ApostaDAOPostgre();
				List<Aposta> apostas = dao.getList();
				apostadoresModel.setBeanList(apostas);
				criaArquivo("apostadores", apostas);
			}

		});
		botoes.add(recuperarTodos);

		JButton vencedoresBrasil1 = new JButton("Vencedores Brasil 1");
		vencedoresBrasil1.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {				
				apostadoresModel.setBeanList(new ArrayList<Aposta>());

				ApostaDAOPostgre dao = new ApostaDAOPostgre();			
				Aposta apostaControle = getApostaControle();				

				List<Aposta> apostas = dao.getVencedoresBrasil(1,
						apostaControle.getJogosBrasil().getBrasil1(),
						apostaControle.getJogosBrasil().getCoreia());
				apostadoresModel.setBeanList(apostas);
				criaArquivo("vencedoresBrasil1", apostas);
			}

		});
		botoes.add(vencedoresBrasil1);

		JButton vencedoresBrasil2 = new JButton("Vencedores Brasil 2");
		vencedoresBrasil2.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				apostadoresModel.setBeanList(new ArrayList<Aposta>());

				ApostaDAOPostgre dao = new ApostaDAOPostgre();

				Aposta apostaControle = getApostaControle();				

				List<Aposta> apostas = dao.getVencedoresBrasil(2,
						apostaControle.getJogosBrasil().getBrasil2(),
						apostaControle.getJogosBrasil().getCostadomarfim());
				apostadoresModel.setBeanList(apostas);
				criaArquivo("vencedoresBrasil2", apostas);
			}

		});
		botoes.add(vencedoresBrasil2);

		JButton vencedoresBrasil3 = new JButton("Vencedores Brasil 3");
		vencedoresBrasil3.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				apostadoresModel.setBeanList(new ArrayList<Aposta>());

				ApostaDAOPostgre dao = new ApostaDAOPostgre();

				Aposta apostaControle = getApostaControle();				

				List<Aposta> apostas = dao.getVencedoresBrasil(3,
						apostaControle.getJogosBrasil().getBrasil3(),
						apostaControle.getJogosBrasil().getPortugal());
				apostadoresModel.setBeanList(apostas);
				criaArquivo("vencedoresBrasil3", apostas);
			}

		});
		botoes.add(vencedoresBrasil3);

		JButton classificacao = new JButton("Classificacao");
		classificacao.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				apostadoresModel.setBeanList(new ArrayList<Aposta>());
				classificar();				
			}

		});	
		botoes.add(classificacao);

		JButton voltar = new JButton("Voltar");
		voltar.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				janela.dispose();
				new TelaInicial().abrir();			
			}

		});
		botoes.add(voltar);

		return botoes;
	}

	private void classificar(){		

		final JFrame progress = new JFrame();
		JPanel panel = new JPanel();
		panel.add(new JLabel("Processando"), BorderLayout.NORTH);
		progress.setSize(200, 100);
		final JProgressBar progressBar = new JProgressBar(0,100);
		panel.add(progressBar, BorderLayout.SOUTH);
		progress.add(panel);
		progress.setVisible(true);			

		Thread calcular = new Thread(){

			public void run(){
				ApostaDAOPostgre dao = new ApostaDAOPostgre();
				List<Aposta> apostas = dao.getList();	
				Aposta controle = getApostaControle();
				controle = dao.getResultados(controle);

				int done = 0;
				int total = apostas.size();
				while(apostas.size() > 0){
					int pontuacao = 0;
					Aposta aposta = apostas.remove(0);
					aposta = dao.getResultados(aposta);
					for(int i = 0; i < 48; i++){
						if(controle.getResultados().get(i).getResultado() == aposta.getResultados().get(i).getResultado())
							pontuacao++;
					}
					aposta.setPontuacao(pontuacao);
					dao.update(aposta);
					done++;
					progressBar.setValue(done*100/total);
					progress.repaint();
				}				
				List<Aposta> classificacao = dao.getClassificacao();
				apostadoresModel.setBeanList(classificacao);
				progress.dispose();
				criaArquivo("classificacao", classificacao);
			}


		};
		calcular.start();

	}

	private Aposta getApostaControle(){
		ApostaDAOPostgre dao = new ApostaDAOPostgre();
		Aposta apostaControle = new Aposta();
		apostaControle.setId(dao.apostaControleId);
		return dao.getById(apostaControle);
	}

	private void criaArquivo(String nomeArquivo, List<Aposta> lista) {
		try{
			Document doc = new Document(PageSize.A4);
			PdfWriter writer = PdfWriter.getInstance(doc,
					new FileOutputStream(nomeArquivo + ".pdf"));
			doc.open();		
			float[] widths = {1,1,3,3,1};
			PdfPTable table = new PdfPTable(widths);
			table.addCell("Classif");
			table.addCell("Num");
			table.addCell("Nome");
			table.addCell("Turma");
			table.addCell("Pontos");
			
			int count = 0;
			for(Aposta aposta : lista){
				count++;
				table.addCell(Integer.toString(count));
				table.addCell(Integer.toString(aposta.getNumero()));
				table.addCell(aposta.getNome());
				table.addCell(aposta.getTurma());
				table.addCell(Integer.toString(aposta.getPontuacao()));
			}
			
			doc.add(table);		
			doc.close();
		}
		catch(IOException e){
			//TODO
			e.printStackTrace();
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
